package com.yzm.file;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * 文件复制
 * 1.使用fileChannel 进行复制
 * 2.使用Paths 进行复制
 */
public class FileCopy {

    public static void main(String[] args) {
        /**
         * 使用fileChannel 进行复制
         * param 1 复制起点
         * param 2 复制长度
         * param 2 目的文件的channel
         */
        try (
                FileChannel channel_r = new FileInputStream("G:\\IDEAProjects\\code-snippet\\Code-snippet-File\\test.txt").getChannel();
                FileChannel channel_t = new FileOutputStream("G:\\IDEAProjects\\code-snippet\\Code-snippet-File\\testCopy.txt").getChannel();
        ) {
            channel_r.transferTo(0, channel_r.size(), channel_t);
            /*
             * 注意：：一次传输最大 2g
             * 所以需要循环
             */
            for (long left = channel_r.size(); left > 0; ) {
                System.out.println("position:" + channel_r.position() + " left:" + left);
                left -= channel_r.transferTo(channel_r.size() - left, left, channel_t);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        /**
         * 使用Files 复制
         * param 1 源文件的Path（可通过Paths.get("文件路径")获取）
         * param 2 目的文件的Path（可通过Paths.get("文件路径")获取）--可不存在
         * param 3 复制文件的操作选项
         * StandardCopyOption.REPLACE_EXISTING 如果目标文件已经存在，则必须添加如此属性方可成功
         */
        try {
            Files.copy(Paths.get("G:\\IDEAProjects\\code-snippet\\Code-snippet-File\\test.txt"), Paths.get("G:\\IDEAProjects\\code-snippet\\Code-snippet-File\\testCopy.txt"), StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
